package com.atguigu.spring.controller;

import com.atguigu.spring.event.ProductOnSaleEvent;
import com.atguigu.spring.service.api.ProductService;
import jakarta.annotation.Resource;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @Resource
    private ProductService productService;

    @Resource
    private ApplicationEventPublisher publisher;

    @GetMapping("/product/on/sale/{productId}")
    public String productOnSale(@PathVariable("productId") Integer productId) {

        productService.onSale(productId);
        // 传统实现方式：单线程、同步调用，代码集中到一起
//        productService.putIntoCache(productId);
//        productService.putIntoSearch(productId);
//        productService.putIntoAdQueue(productId);
//        productService.pushToGuest(productId);


            /* 基于事件思维升级方式：发布事件
            spring 的事件机制 对象，即 ApplicationEventPublisher对象
            调用 publishEvent()方法,传入对应的 事件对象
             */
        publisher.publishEvent(new ProductOnSaleEvent(productId));

        // 发布事件之后，其它操作都不必操心了，立即返回响应
        return "product on sale success";
    }

}
